/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.code.motoo;

import java.net.InetSocketAddress;

import com.google.code.motoo.core.Acceptor;
import com.google.code.motoo.core.IoHandler;
import com.google.code.motoo.core.Reader;
import com.google.code.motoo.core.TaskExecutor;
import com.google.code.motoo.core.TimeoutControl;
import com.google.code.motoo.core.WriteExecutor;
import com.google.code.motoo.filter.DefaultFilterChainBuilder;
import com.google.code.motoo.filter.DefaultIoFilterChainBuilder;

/**
 * 
 * @author linfengqi
 * @version 1.0  May 13, 2009
 */
public class NioServer {
	private InetSocketAddress address;
	private Acceptor acceptor = new Acceptor();
	private TimeoutControl timeoutControl = new TimeoutControl();
	
	public NioServer() {
	}
	
	public void bind() throws Exception {
		bind(address);
	}
	
	public void bind(InetSocketAddress address) throws Exception {
		timeoutControl.init();
		acceptor.bind(address);
	}
	
	public void setIoHandle(IoHandler ioHandler) {
		acceptor.setIoHandler(ioHandler);
	}
	
	public DefaultIoFilterChainBuilder getIoFilterChain() {
		return acceptor.getIoFilterChain();
	}

	public DefaultFilterChainBuilder getFilterChain() {
		return acceptor.getFilterChain();
	}

	public Reader getReader() {
		return acceptor.getReader();
	}

	public WriteExecutor getWriteExecutor() {
		return acceptor.getWriteExecutor();
	}

	public TaskExecutor getTaskExecutor() {
		return acceptor.getTaskExecutor();
	}

	public TimeoutControl getTimeoutControl() {
		return timeoutControl;
	}

	public Acceptor getAcceptor() {
		return acceptor;
	}
	
	public void setKeepAlive(boolean keepAlive) {
		acceptor.setKeepAlive(keepAlive);
	}

}
